package com.cdel.akka.pso;

import akka.actor.ActorSystem;
import akka.actor.Props;

//当粒子群的数量达到100w时，基本每次的最大收益都能达到43.05万之上了，与我们计算的理论值43.09非常接近，基本能满足我们的要求。还有一个值得注意的问题，这里创建了100w个粒子，
//如果是创建这么多线程，我这ThinkPad的笔记本估计早卡死了，但在测试的时候，电脑完全不卡，并且一分钟不到也就运算完了，可见在系统中是可以启用大量的Actor，提高了我们对并发的支持。

//既然最优的方案很难得到，那么我们就想办法以很低的成本获得一个还算过得去的方案。在这个小案例中也能看到，在很多情况下，虽然进化算法无法让你获得最优解，也无法证明他得到的解与
//最优解到底有多少差距，但实际中，通过进化算法搜索到的满意解很可能与最优解已经非常接近了。

//比如有这么一个问题：
//假设有400万资金，要求4年内使用完。若在任意一年使用x万元，则可以获取√x万元的收益（本金和收益均不能再使用）；当年不用的资金可以存入银行，年利率为10%，这部分的本金和收益均能拿去使用。
//数学好的使用拉格朗日公式对方程组求解很快就能算出第一年使用86.19万元，第二年使用104.29万元，第三年使用126.29万元，第四年使用152.69万元，能获得43.09万元的最优收益。
//数学不好的也没事，现在不有了计算机么，下面让我们的计算机试试，看看能得到什么样的结果。

//粒子算法的计算过程：
//1、初始化所有粒子，粒子的位置随机生成，计算每个粒子当前的适应度，并将此设为当前粒子的个体最优值，记为pBest
//2、所有粒子将自己的个体最优值发送给管理者，管理者获得所有粒子的信息后，筛选出全局最优的解，记为gBest
//3、管理者将gBest通知所有粒子，所有粒子便知道全局最优点的位置
//4、接着，所有粒子根据自己的pBest和全局gBest，更新自己的速度，在有了速度后，再更新自己的位置。公式：。。。
//5、如果粒子产生了新的个体最优点，则发送给管理者，在此，转到步骤2
public class PSOMain {

	public static final int BIRD_COUNT = 1000000;

	public static void main(String args[]) {

		// 创建Actor的管理和维护系统
		ActorSystem system = ActorSystem.create("psoSystem");
		// 创建Master粒子
		system.actorOf(Props.create(MasterBird.class), "masterbird");
		// 创建Bird粒子群
		for(int i=0; i<BIRD_COUNT; i++) {
			system.actorOf(Props.create(Bird.class), "bird_" + i);
		}
	}
}